package com.neouton.crm.pm.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.neouton.common.util.PageUtil;
import com.neouton.crm.pm.entity.BackMoneyPlanVo;
import com.neouton.crm.pm.entity.ContractInfoVO;
import com.neouton.crm.sales.entity.SalesChangeVO;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 合同相关Service
 * @Author libingkun
 * @Date 2022年11月30日
 * @Version 1.0
 *          初始化迁移
 */
public interface IContractInfoService{

    /**
     * 保存合同信息
     * @param contractInfo
     * @return
     */
    Integer saveOrUpdateContractInfo(ContractInfoVO contractInfo,String token);

    /**
     * 更具主键获取项目信息
     * @param approvalId 审批主键
     * @return
     */
    ContractInfoVO queryContractInfoByapprovalId(Integer approvalId);

    /**
     * 更具主键获取合同历史数据
     * @param approvalId 审批主键
     * @return
     */
    ContractInfoVO getContractInfoHistoryByApprovalId(Integer approvalId);

    /**
     * 更具主键获取项目信息
     * @param ContractId
     * @return
     */
    ContractInfoVO queryContractInfoById(Integer ContractId);

    /**
     * 更具项目ID获取合同信息
     * @param projectId
     * @return
     */
    List<ContractInfoVO> queryContractInfoByProjectId(Integer projectId,String callWms);
    /**
     * 获取当日最大合同单号
     * @return
     */
    String getContractMaxNumByDate();


    /**
     * 获取变更记录
     * @param contractInfoId
     * @return
     */
    List<SalesChangeVO> queryChangeInfo(Integer contractInfoId);

    /**
     * 保存回款计划
     * @param backMoneyPlanList
     */
    void saveBackMoneyPlan(List<BackMoneyPlanVo> backMoneyPlanList);

    /**
     * 根据合同id查询得到回款计划内容
     * @param id
     * @return
     */
    List<BackMoneyPlanVo> searchBackMoneyPlanBycontractId(Integer id);


    /**
     * 根据合同id查询得到回款计划内容
     * @param id
     * @return
     */
    BackMoneyPlanVo searchBackMoneyPlanByBmpId(Integer id);

    /**
     * 合同信息通过审批
     * @param contractInfo
     * @return
     */
    Boolean rejectionContractInfo(ContractInfoVO contractInfo,String token);

    /**
     * 合同信息驳回审批
     * @param contractInfo
     * @return
     */
    Boolean approveContractInfo(ContractInfoVO contractInfo,String token,Boolean auto);

    /**
     * 通过项目ID查询目前项目下 审批中或审批通过的合同总金额
     * @param projectId 项目ID
     * @return
     */
    BigDecimal queryConMoneyByProjectId(Integer projectId);


    /**
     * 分页查询
     *
     * @param page
     * @param entity
     * @return
     */
    PageUtil<ContractInfoVO> queryContractsByPage(IPage page, ContractInfoVO entity,String token);

    /**
     * 一指禅系统产品列表导出
     *
     * @param response
     */
    void exportContractInfo(HttpServletResponse response, ContractInfoVO entit, String token) throws Exception;


    /**
     * 分页查询
     *
     * @param page
     * @param entity
     * @return
     */
    PageUtil<BackMoneyPlanVo> queryBackMoneyPlansByPage(IPage page, BackMoneyPlanVo entity,String token);

    /**
     * 回款计划列表导出
     *
     * @param response
     */
    void exportBackMoneyPlans(HttpServletResponse response, BackMoneyPlanVo entit, String token) throws Exception;

    /**
     * 更据采合同ID获取合同相关回款 开票记录数据
     * @param conId
     * @return
     */
    Map<String,BigDecimal> queryPurBackInfoByConId(int conId);

    /**
     * 分页查询待办信息
     *
     * @param page
     * @param entity
     * @return
     */
    PageUtil<ContractInfoVO> queryApprovalContractByPage(IPage page, ContractInfoVO entity);


    /**
     * 分页查询已办信息
     *
     * @param page
     * @param entity
     * @return
     */
    PageUtil<ContractInfoVO> queryApprovalContractDoneByPage(IPage page, ContractInfoVO entity);

    /**
     * 分页查询申请记录信息
     *
     * @param page
     * @param entity
     * @return
     */
    PageUtil<ContractInfoVO> queryApprovalContractRecordByPage(IPage page, ContractInfoVO entity,String token);

    /**
     * 逻辑删除合同信息
     * @param conId
     * @return
     */
    Boolean deleteContractInfoById(Integer conId);

    void updateContractInfoAfterPass(ContractInfoVO contractInfoVO, String token);

    ContractInfoVO queryContractInfoFromCache(int contractId, String token);

    List<ContractInfoVO> replaceBackMoneyByContractId(List<ContractInfoVO> contractInfoVOs, String token);
}
